#pragma once
#include "Buffer.h"
#include <fcntl.h>
#include <map>
#include <functional>
using namespace std;

/* Http响应的格式
*	请求行:   协议版本 状态码 状态描述符\r\n
*	响应报头: key: value\r\n
*	空行:     \r\n
*	有效载荷: 用户请求的资源
*/

// #define MSG_SEND_AUTO

enum class StatusCode { // 状态码
	UnKnow,                 // 未知状态码(默认)
	OK = 200,				// 请求处理成功了
	MovedPermanently = 301, // 永久重定向
	MovedTemporarily = 302, // 临时重定向
	BadRequest = 400,		// 发送的请求是错误请求
	NotFound = 404			// 无法找到请求的静态资源
};

class HttpResponse { // Http响应
public:
	HttpResponse();  // 实例化HttpResponse
	~HttpResponse(); // 销毁HttpResponse

	// 添加响应头键值对到response
	void addHeader(const string key, const string value);

	// 构建Http响应，并发送到sendBuf
	void prespareMsg(Buffer* sendBuf, int sockfd);

	// 设置属性
	void setFileName(string name) { _fileName = name; }
	void setStatusCode(StatusCode code) { _statusCode = code; }

	function<void(const string, Buffer*, int)> _sendDataFunc; // 发送响应的有效载荷
private:
	StatusCode _statusCode;		  // 状态码
	map<string, string> _headers; // 响应报头
	string _fileName;			  // 请求的文件的名字
	map<int, string> _info = {    // 状态码和状态描述的对应关系
		{200, "OK"},
		{301, "MovedPermanently"},
		{302, "MovedTemporarily"},
		{400, "BadRequest"},
		{404, "NotFound"},
	};
};
